home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 12 / CU Amiga Magazine's Super CD-ROM 12 (1997)(EMAP Images)(GB)[!][issue 1997-07].iso / CUCD / Games / DestructivePoker / sources / sources.lha / handpile.cpp < prev    next >
C/C++ Source or Header  |  1997-02-13  |  4KB  |  201 lines

  1. /*
  2.         handpile.cpp (Käsipakan ohjelmamoduuli)
  3.  
  4.         V?.?? - ??????  Kimmo Teräväinen
  5.         -----   ------  ----------------
  6.         V0.01   121296  Added ShowHandEvaluation
  7.  
  8.         Look handpile.h
  9. */
  10.  
  11. #include "handpile.h"
  12.  
  13. #ifndef _Windows
  14. #include "requester.h"
  15. #endif
  16.  
  17. char *HandEvalText[] = {
  18.   "Lousy Hand",
  19.   "Pair",
  20.   "Two Pairs",
  21.   "Three of Kind",
  22.   "Straight",
  23.   "Flush",
  24.   "Full House",
  25.   "Four of Kind",
  26.   "Five of Kind",
  27.   "Straight Flush",
  28.   "Royal Flush"
  29. };
  30.  
  31.  
  32. void ShowHandEvaluation(TWindow *wnd,int eval)
  33. {
  34. #ifdef _Windows
  35.   wnd->MessageBox(HandEvalText[eval],"Your Hand:");
  36. #else
  37.   cRequester(wnd,"Your Hand:",HandEvalText[eval]).Execute();
  38. #endif
  39. }
  40.  
  41. cIMGCard *cHandPile::Deal()
  42. {
  43.   cIMGCard *card;
  44.   for(int i=0; i<5 ; i++)
  45.     if(cards[i])
  46.       if(cards[i]->Turned()) {
  47.         card=cards[i];
  48.         cards[i]=NULL;
  49.         return card;
  50.       }
  51.   return NULL;
  52. }
  53.  
  54. cIMGCard *cHandPile::Remove(int i)
  55. {
  56.   cIMGCard *card;
  57.   if(i<0 || i>4) return NULL;
  58.   if(cards[i])
  59.     if(cards[i]->Turned()) {
  60.       card=cards[i];
  61.       cards[i]=NULL;
  62.       return card;
  63.     }
  64.   return NULL;
  65. }
  66.  
  67. void cHandPile::Insert(cIMGCard *card)
  68. {
  69.   if(!card) return;
  70.   for(int i=0; i<5 ; i++)
  71.     if(!cards[i]) {
  72.       cPoint p(CARD_SLOT_WIDTH*i,0);
  73.       p+=pos;
  74.       cards[i]=card;
  75.       card->CanTurn();
  76.       card->Turn_CoverUp();
  77.       card->MoveTo(p);
  78.       card->Show();
  79.       return;
  80.     }
  81. }
  82.  
  83.  
  84. int cHandPile::Can_Insert() const
  85. {
  86.   for(int i=0; i<5 ; i++)
  87.     if(!cards[i]) return TRUE;
  88.   return FALSE;
  89. }
  90.  
  91. void cHandPile::TurnAll()
  92. {
  93.   for(int i=0; i<5 ; i++)
  94.     if(cards[i]) cards[i]->Turn_CoverDown();
  95. }
  96.  
  97. void cHandPile::FreezeAll()
  98. {
  99.   for(int i=0; i<5 ; i++)
  100.     if(cards[i]) cards[i]->CanTurn(FALSE);
  101. }
  102.  
  103.  
  104. int cHandPile::Evaluate() const
  105. {
  106.   cCard arvio[5];
  107.   int i,j,c,d,n=0;
  108.  
  109.   // Let's start by copying cards from hand (except jokers) to
  110.   // arvio[] array
  111.   //
  112.   for(i=0; i < 5 ; i++ )
  113.     if (cards[i]->Suit() != JOKER) arvio[n++]=*cards[i];
  114.  
  115.  
  116.   // Special case 5 jokers
  117.   if (n == 0) {
  118.     if(GetPrefs_5jokers()) return ROYAL_FLUSH;
  119.     return LOUSY_HAND;
  120.   }
  121.  
  122.  
  123.   // Sorting array... smallest 1st, ACE is smallest
  124.   for( i=0 ; i<n ; i++)
  125.     for( j=i ; j<n ; j++)
  126.       if (arvio[i].Num() > arvio[j].Num()) {
  127.         cCard temp=arvio[i];
  128.         arvio[i]=arvio[j];
  129.         arvio[j]=temp;
  130.       }
  131.  
  132.  
  133.   // Now special case 4 jokers
  134.   if (n == 1) {
  135.     if( arvio[0].Num_HI() >= T) return ROYAL_FLUSH;
  136.     if(GetPrefs_5ofkind()) return FIVE_OF_KIND;
  137.     return STRAIGHT_FLUSH;
  138.   }
  139.  
  140.   // Search 2 biggest card sets, where cards are same.
  141.   // return amount of item in these sets in c & d.
  142.   //
  143.   // mathematically this is:
  144.   //  c=#{ X1,..Xc: X1=..=Xc=a } ja d=#{ Y1,..Yd: X1=..=Xd=b } , a!=b
  145.   //  where Xj and Yj are numerical values of cards.
  146.   //
  147.   c=1; d=1;
  148.   for(i=1 ; i<n ; i++ ) {
  149.     if(arvio[i-1].Num() != arvio[i].Num()) {
  150.       if(c>1) {
  151.         if(d>1) break;
  152.         d=c;
  153.       }
  154.       c=1;
  155.     } else c++;
  156.   }
  157.  
  158.  
  159.   // If all cards are different we will examine possibility of
  160.   // flush and/or straight. Also 4 of a kind may occur with
  161.   // 3 jokers.
  162.   //
  163.   if(d<2 && c<2) {
  164.     int value=FLUSH;
  165.  
  166.     // Is it Flush
  167.     for(i=1; i<n ; i++)
  168.       if(arvio[i-1].Suit() != arvio[i].Suit()) { value=LOUSY_HAND; break; }
  169.  
  170.     // Is it Straight
  171.     if((arvio[n-1].Num()-arvio[0].Num()) < 5) value+=STRAIGHT;
  172.     if((arvio[0].Num()==A) && (arvio[1].Num() >= T)) value+=STRAIGHT;
  173.  
  174.     if((value<STRAIGHT+FLUSH) && (n==2)) return FOUR_OF_KIND;
  175.  
  176.     if(value==STRAIGHT+FLUSH) {
  177.       value=STRAIGHT_FLUSH;
  178.       if((arvio[0].Num() == A) && (arvio[1].Num() >= T)) return ROYAL_FLUSH;
  179.       if(arvio[0].Num() >= T) return ROYAL_FLUSH;
  180.     }
  181.     if(value!=LOUSY_HAND) return value;
  182.   }
  183.  
  184.  
  185.   if(d>=c) { j=d; } else { j=c; c=d; }  // j=max(d,c); c=min(c,d)
  186.  
  187.   j=j+5-n;    // let's add jokers to bigger card set, when we get best
  188.               // possible hand.
  189.  
  190.   switch(j){
  191.     case 2: if(c==2)  return TWO_PAIRS;
  192.                       return PAIR;
  193.     case 3: if(c==2)  return FULL_HOUSE;
  194.                       return THREE_OF_KIND;
  195.     case 4:           return FOUR_OF_KIND;
  196.     case 5:           return FIVE_OF_KIND;
  197.   }
  198.  
  199.   return LOUSY_HAND;
  200. }
  201.